草庐IT

C++ unique_ptr 和映射

全部标签

c++ - std::shared_ptr 预分配内存

我想在一个堆请求(如std::make_shared)中为shared_ptr的控制block和value_type预分配内存,但是不要立即在其中构造任何对象。当我实际需要构造对象时,使用放置new。可能吗?std::make_shared或std::allocate_shared似乎都无法解决我的问题。 最佳答案 我建议创建延迟初始化包装类,它本身包含足够的内存供您稍后要初始化的对象使用。这个包装器甚至可以有特殊的方法来在析构函数中调用placementnew和delete初始化对象。

c++ - 具有类型删除析构函数的 unique_ptr 不太有效(有警告)

有一个不错的小技巧here允许使用std::unique_ptr不完整的类型。相关代码如下://File:erasedptr.h#include#include//typeeraseddeletor(animplementationtypeusing"veneer")templatestructErasedDeleter:std::function{ErasedDeleter():std::function([](T*p){deletep;}){}};//Aunique_ptrtypedeftemplateusingErasedPtr=std::unique_ptr>;//Declar

c++ - 如何从以 shared_ptr 为键的 unordered_set 中获取基于 raw_ptr 的元素

我想知道是否有办法根据unordered_set的原始指针检索一个元素,该元素以shared_ptr为键。unordered_set>sets;automyobj=make_shared();sets.insert(myobj);//Findtheelementmyobjsets.find(myobj);//Howtofindtheelementbasedontheunderlyingrawpointer?sets.find(my.obj.get());(my.obj.get())); 最佳答案 要仅使用底层原始指针查找您要查找的内

c# - 如何编写用于将 Qt 信号映射到 C# 事件的包装类(通过 C++/CLI)

通过C++/CLI包装器调用C++/Qt类就像在公园散步一样。但我无法将C++/Qt信号映射到C#事件。我尝试结合一些可用的操作方法/答案,但没有得到任何有效结果:HowtomapQtSignaltoEventinManagedC++(C++/CLI)Callingmanagedcodefromunmanagedcodeandvice-versa和其他一些不那么直接相关的...这里的问题是,这些操作方法/答案已经很老了。我目前正在使用Qt5.5(即将推出5.6)和.NET4.6。我试图使一切适应当前的技术水平,但可能失败了。可能是因为树太多,我看不到森林,所以我想求一个工作的例子,用当

c++ - Boost.asio 和异步链,unique_ptr?

我对异步编程不是很熟悉,我有一个问题。我的问题如下。给定boost.asio中C++11的echo_server示例:http://www.boost.org/doc/libs/1_60_0/doc/html/boost_asio/example/cpp11/spawn/echo_server.cpp我想知道std::make_shared可以在C++14中替换为std::unique_ptr在C++14中,避免了引用计数的开销。我不确定,因为我们有shared_from_this()但不是像unique_from_this()这样的东西,那么我怎样才能访问unique_ptr从里面t

c++ - C++14 中的模板到模板映射

我想在C++14中做一个模板到模板的映射。先验地,似乎以下代码可以解决问题templatestructKeyType{};templatestructValueType{Tx;};templateclassK>structMap;templatestructMap{templateusingtype=ValueType;};ValueTypetest{42};Map::typetestM{42};//Sameasabove但是,以下表达式在使用clang++v3.8编译时返回false。templateclassTemplateType>structNeedsTemplate;std:

c++ - new T(...) 与 std::make_unique<T>(...).release()

我正在查看companioncode的"HourglassAPI"talkCppCon2014的主要内容是通过使用具有C签名的函数包装类的成员函数来为C++库提供CAPI。除其他外,我对对象的构造方式很感兴趣。在构造新的hairpoll对象的函数hairpoll_construct中,通过获取指针std::make_unique(person).release()实际上是在处理异常的函数中调用的。一个更简单的方法是求助于一个普通的newhairpoll(person)哪些场景更适合前者?这是否与这个特殊API的工作方式有关,还是比这更通用? 最佳答案

c++ - 让 shared_ptr 成员破坏 CopyConstructible 契约吗?

我刚刚在codereview争论过其中声明具有std::shared_ptr成员的类会破坏CopyConstructible契约(Contract),特别是:ThefollowingexpressionsmustbevalidandhavetheirspecifiedeffectsTu=v;Thevalueofvisunchanged原因是复制会通过增加shared_ptr的引用计数来更改源对象,但我的反对意见是引用计数与shared_ptr。更改引用计数是一种副作用,但引用并未说明禁止在被复制的对象之外产生副作用。但我不是语言律师,所以我可能是错的。根据C++标准,什么是正确的?

c++ - 使用内存映射文件进行持久化 - 是否需要 volatile?

我需要在重新启动时持久保留uint64_t标记。为了实现这一点,我使用boost::interprocess::mapped_region来内存映射我在同一进程中创建的文件:bip::file_mappingfile(filename.c_str(),bip::read_write);autoregion=std::make_unique(file,bip::read_write);然后我将地址转换为我的uint64_t类型usingTag=uint64_t;Tag&curr_=*reinterpret_cast(region->get_address());现在我可以后递增标签,获取

使用 unique_ptr 包含 char 数组的 C++ 对象

我正在寻找一种方法来使用unique_ptr来分配一个结构,该结构包含一个char数组,其中包含动态设置的字节数以支持不同类型的消息。假设:structMyMessage{uint32_tid;uint32_tdata_size;chardata[4];};如何将下面的send_message()转换为使用智能指针?voidsend_message(void*data,constsize_tdata_size){constautomessage_size=sizeof(MyMessage)-4+data_size;constautomsg=reinterpret_cast(newcha